using System;
using Game.Board;
using HCore.IOC.Beans.Factory.Attribute.Attr;
using HCore.IOC.Context.Event.Attr;
using HCore.Unity.Core;
using JetBrains.Annotations;
using Session;
using UI.UIGame.Cursor;
using UnityEngine;

namespace UI.UIGame.Menu.SortTile
{
    /// <summary>
    ///     在 SimilarColor 排序策略下，第一次点击是选取颜色，第二次点击是启动排序。其它策略第一次点击就是排序了。
    /// </summary>
    public class SortTileVisual : SessionHCoreMonoBehaviour<ISortTileSession>
    {
        [Autowired] private BoardService aBoardService;
        [Autowired] private CursorService aCursorService;
        private Color? mCurrentPickColor; // 当前选取的颜色
        private FunctionUpdater mLeftMouseClickFunctionUpdater;
        private FunctionUpdater mRightMouseClickFunctionUpdater;

        #region Mouse Event

        /// <summary>
        ///     启动排序计划后的左键点击事件
        ///     <para>在 SimilarColor 排序策略下，第一次点击是选取颜色，第二次点击是启动排序。其它策略第一次点击就是排序了。</para>
        /// </summary>
        /// <param name="worldPosition"></param>
        private void OnMouseClickLeft(Vector3 worldPosition)
        {
            if (Session == null) return;
            // 只能在游戏界面
            if (GameManager.GetRouter() != Router.GamePage) return;
            // 鼠标覆盖在游戏UI上
            if (Session.IsMouseOverlayOnGameUI) return;
            // 预排序 Tile 未启动
            if (!Session.IsPreSortingStartedTile) return;
            // 没有预排序策略
            if (Session.CurrentSortPolicy == SortPolicy.None) return;
            // 鼠标点击到UI上了
            if (GameUtils.IsPointerOverUI()) return;

            switch (Session.CurrentSortPolicy)
            {
                case SortPolicy.Side:
                    aBoardService.SortSideTiles(worldPosition);
                    break;
                case SortPolicy.NineGrid:
                    aBoardService.SortNineGridTiles(worldPosition);
                    break;
                // 在 SimilarColor 排序策略下，第一次点击是选取颜色，第二次点击是启动排序。其它策略第一次点击就是排序了。
                case SortPolicy.SimilarColor:
                    if (!mCurrentPickColor.HasValue)
                        GameUtils.PickColorFromScreenPoint(color =>
                        {
                            mCurrentPickColor = color;
                            Debug.Log($"获取到颜色：{color}");
                        });
                    else aBoardService.SortSimilarColorTiles(worldPosition, mCurrentPickColor.Value);
                    break;
                case SortPolicy.None:
                    // 方法入口已经校验，程序不应该走到这个分支。
                    Debug.LogWarning("方法入口已经校验，程序不应该走到这个分支。");
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        /// <summary>
        ///     启动排序计划后的右键点击事件
        /// </summary>
        /// <param name="worldPosition"></param>
        private void OnMouseClickRight(Vector3 worldPosition)
        {
            if (Session == null) return;
            if (Session.IsMouseOverlayOnGameUI) return;
            if (!Session.IsPreSortingStartedTile) return;
            if (Session.CurrentSortPolicy == SortPolicy.None) return;

            // 发送停止排序命令
            PublishEvent(new SortStopCommand());
        }

        /// <summary>
        ///     注销鼠标点击监听
        /// </summary>
        private void DestroyMouseClickFunctionUpdater()
        {
            //去掉左键点击的监听方法
            mLeftMouseClickFunctionUpdater?.DestroySelf();
            mLeftMouseClickFunctionUpdater = null;

            //去掉右键点击的监听方法
            mRightMouseClickFunctionUpdater?.DestroySelf();
            mRightMouseClickFunctionUpdater = null;
        }

        /// <summary>
        ///     创建鼠标点击监听
        /// </summary>
        private void CreateMouseClickFunctionUpdater()
        {
            // 添加左键点击监听方法
            mLeftMouseClickFunctionUpdater?.DestroySelf();
            mLeftMouseClickFunctionUpdater = GameUtils.CreateMouseClickAction(0, OnMouseClickLeft);

            // 添加右键点击监听方法
            mRightMouseClickFunctionUpdater?.DestroySelf();
            mRightMouseClickFunctionUpdater = GameUtils.CreateMouseClickAction(1, OnMouseClickRight);
        }

        #endregion

        #region EventListener

        [UsedImplicitly]
        [EventListener]
        private void OnSortPrepareCommand(SortPrepareCommand prepareCommand)
        {
            Debug.Log("EventListener OnSortPrepareCommand");
            if (Session == null) return;
            if (Session.CurrentSortPolicy != SortPolicy.None)
            {
                Debug.LogWarning($"EventListener OnSortPrepareCommand，请停止当前的预排序后再发起预排序指令。 CurrentSortPolicy：{Session.CurrentSortPolicy}");
                return;
            }

            // 启动预排序Tile
            Session.IsPreSortingStartedTile = true;

            // 设置当前排序策略
            Session.CurrentSortPolicy = prepareCommand.SortPolicy;

            // 显示鼠标图标
            aCursorService.ShowCursorIcon(prepareCommand.CursorIconSprite, Color.red);

            // 添加鼠标点击监听方法
            CreateMouseClickFunctionUpdater();
        }

        [UsedImplicitly]
        [EventListener]
        private void OnSortStopCommand(SortStopCommand stopCommand)
        {
            Debug.Log("EventListener OnSortStopCommand");
            if (Session == null) return;

            // 隐藏鼠标排序图标
            aCursorService.HiddenCursorIcon();
            // 注销鼠标点击事件
            DestroyMouseClickFunctionUpdater();
            // 取消预排序
            Session.IsPreSortingStartedTile = false;
            // 清空当前排序策略
            Session.CurrentSortPolicy = SortPolicy.None;
            // 清空当前获取的颜色
            mCurrentPickColor = null;
        }

        [UsedImplicitly]
        [EventListener]
        private void OnRouterEvent(RouterEvent routerEvent)
        {
            // 打开游戏界面菜单
            if (routerEvent.NewRouter == Router.GamePageMenu) OnSortStopCommand(null);
        }

        #endregion
    }
}